package smallfrench.moteur.noeuds;

import smallfrench.moteur.biblio.RBooleen;
import smallfrench.moteur.biblio.RChaine;
import smallfrench.moteur.biblio.REntier;
import smallfrench.moteur.biblio.RFlottant;
import smallfrench.moteur.biblio.RRien;
import smallfrench.moteur.interp.Portee;
import smallfrench.moteur.interp.RObjet;
import smallfrench.moteur.lexer.lexemes.Lexeme;
import smallfrench.moteur.lexer.lexemes.LexemeChaine;
import smallfrench.moteur.lexer.lexemes.LexemeEntier;
import smallfrench.moteur.lexer.lexemes.LexemeFlottant;

/**
 * Une constante, un littéral.
 * @author antoine1023
 */
public class NConstante extends Noeud {

	public final RObjet rObjet;

	public NConstante(Lexeme t, RObjet rObjet) {
		super(t);
		this.rObjet = rObjet;
	}

	public NConstante(Lexeme t) {
		super(t);

		switch (t.type) {

		case CONST_CHAINE:
			rObjet = new RChaine(((LexemeChaine) t).valeur);
			break;
		case CONST_ENTIER:
			rObjet = new REntier(((LexemeEntier) t).valeur);
			break;
		case CONST_FLOTTANT:
			rObjet = new RFlottant(((LexemeFlottant) t).valeur);
			break;
		case CONST_FAUX:
			rObjet = RBooleen.FAUX;
			break;
		case CONST_RIEN:
			rObjet = RRien.RIEN;
			break;
		case CONST_VRAI:
			rObjet = RBooleen.VRAI;
			break;

		default:
			throw new IllegalArgumentException(t.type + " innattendu");
		}
	}

	public NConstante(LexemeChaine t) {
		super(t);
		this.rObjet = new RChaine(t.valeur);
	}

	public NConstante(LexemeEntier t) {
		super(t);
		this.rObjet = new REntier(t.valeur);
	}

	public NConstante(LexemeFlottant t) {
		super(t);
		this.rObjet = new RFlottant(t.valeur);
	}

	@Override
	public RObjet evaluer(Portee portee) {
		return rObjet;
	}

	@Override
	public String toString() {
		if (rObjet instanceof RChaine)
			return '"' + rObjet.toString() + '"';
		return rObjet.toString();
	}

}
